#include <iostream>
#include <memory>
#include "main.h"
#include "smart_ptr.h"

using namespace std;

void test2()
{
    double *p = new double();
    {
        SmartPtr<double> sptr1(p); //  出了作用域，计数器减1
        {
            SmartPtr<double> p1_0 = sptr1;
            SmartPtr<double> p1_1 = p1_0;
            {
                SmartPtr<double> sptr2(sptr1); //  出了作用域，计数器减1
                {
                    SmartPtr<double> sptr3(sptr1); //  出了作用域，计数器减1
                }
            }
        }
    }
    cout << *p << endl; //  动态分配的对象已被释放，故输出垃圾值
}
//  测试函数
void test()
{
    printf("\n\n********智能指针自定义***********\n");
    int *p = new int(42);
    {
        SmartPtr<int> sptr1(p); //  出了作用域，计数器减1
        {
            SmartPtr<int> p1_0 = sptr1;
            SmartPtr<int> p1_1 = NULL; //此处会走初始化
            // p1_1 = sptr1;
            // test2();
            {
                SmartPtr<int> sptr2(sptr1); //  出了作用域，计数器减1
                {
                    SmartPtr<int> sptr3(sptr1); //  出了作用域，计数器减1
                }
            }
        }
    }
    cout << *p << endl; //  动态分配的对象已被释放，故输出垃圾值
    printf("\n********智能指针End***********\n\n");
}

void autoPointerSimple()
{
    TestCls *t, *t2;
    t = new TestCls("张三", 18);
    t2 = t;

    delete t;
    t->say();
    printf("t1的地址：%p\n", &t);

    delete t2;
    t2->say();
    printf("t2的地址：%p\n", &t2);
}

int main(int argc, char const *argv[])
{

    printf("C++ version : ");
    cout << __GNUC__ << endl;
    cout << __cplusplus << endl;
    test();
    // autoPointerSimple();
    // useAutoPointer();
    {
        std::shared_ptr<StructA> tst = std::make_shared<StructA>();
        tst->name = "张三";
        shared_ptr<StructA> &testCls = tst;
        cout << testCls->name << endl;
    }
}
